# 统计mean和std
#os是与linux一样的命令行操作
#cv2:一个基于BSD许可(开源)发行的跨平台计算机视觉库copy
#tqdm:显示循环的进度条的库。taqadum,在阿拉伯语中的意思是进展。tqdm可以在长循环中添加一个进度提示信息，用户只需要 封装任意的迭代器 tqdm(iterator)，是一个快速、扩展性强的进度条工具库。
import os
import cv2
import numpy as np
from tqdm import tqdm

#np.zeros():返回来一个给定形状和类型的用0填充的数组
#os.listdir()：返回指定路径下的文件和文件夹列表。
img_list_1440 = []
img_list_576 = []
means = np.zeros(3)
stdevs = np.zeros(3)
imgs_path = "train/200/images"
imgs_name = os.listdir(imgs_path)#返回指定路路径的图片名字
#enumerate():将一个可遍历的数据对象（如列表，元祖或字符串）组合为一个索引序列，同时列出数据和数据下标，一般用在for语句中
for idx, name in tqdm(enumerate(imgs_name)):#遍历一个imags_name序列
    if name == ".ipynb_checkpoints":
        continue
    #cvtColor():用于各种图像之间的转换，比如将OpenCV中的BGR图像转换为常用的RGB、YUV等图像，也能用于将彩色图像转换为灰度图像
    img = cv2.cvtColor(cv2.imread(os.path.join(imgs_path, name)), cv2.COLOR_BGR2RGB)#cv2.COLOR_BGR2RGB意思是将BGR变成RGB
    img = img[:, :, :, np.newaxis]#np.newaxis:是增加维度的意思，写一个表示增加一维，两个表示增加2维
    #img.shape[0]:读入图片时的高度height
    #img.shape[1]:读入图片时的宽度weight
    if img.shape[0] == 1440:#图片宽度为1440时
        img_list_1440.append(img)
    else:
        img_list_576.append(img)
#让img_list先获取img_list_1440的列表值，然后再获取img_list_576的列表
for img_list in [img_list_1440, img_list_576]:
    #np.concatenate（）：主要作用是沿现有的某个轴对一系列数组进行拼接
    #axis = 0默认是横向凭拼接，axis = -1是纵向拼接
    imgs = np.concatenate(img_list, axis=-1)
    #astype(no.float32):修改数据类型为float
    imgs = imgs.astype(np.float32) / 255.
    for i in tqdm(range(3)):
        # ravel():将多维的数组将位一维
        pixels = imgs[:, :, i, :].ravel()
        means[i] += float(np.mean(pixels))
        #np.std():是求标准差的函数
        stdevs[i] += float(np.std(pixels))

print(means / 2, stdevs / 2)